/* Programa que realiza a multiplicação de uma matriz por um vetor */

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <complex.h>
#include <string.h>
#include <unistd.h>

#include <gsl/gsl_complex.h>
#include <gsl/gsl_complex_math.h>
#include <gsl/gsl_vector_complex.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_fft_complex.h>


// gsl_vector * gsl_vector_alloc (size_t N)
// gsl_vector_set_all (gsl_vector * V, double X)

#define N 10

/* 	Multiplicação de matriz por vetor

	Multiplica os elementos da primeira linha da matriz, pelos elementos do vetor coluna, e soma-os.
	Este será o elemento (1,1) do vetor resultado.
	Faz isto para as outras linhas da matriz, gerando o restante do vetor resultado

	Matematicamente:
	Matriz A com elementos a_ij
	Vetor V com elementos v_i
	Vetor R com eleemntos r_i

	R = AV

	r_i = soma_em_j (a_ij * v_j)

	Repete o processo para todos os i
	
*/

int main(void)
{
	int i,j;
	gsl_vector* v;
	gsl_vector* r;
	gsl_matrix* A;
	double tmp;
	
	v = gsl_vector_alloc(N);
	r = gsl_vector_alloc(N);

	A = gsl_matrix_alloc(N, N);

	/* Define o vetor v */
	for ( j = 0 ; j < N ; j++ )
	{
		gsl_vector_set(v, j, j%13);
	}

	gsl_vector_set_zero(r);

	/* Define a matriz A */
	for ( i = 0 ; i < N ; i++ )
	{
		for ( j = 0 ; j < N ; j++ )
		{
			gsl_matrix_set(A, i, j, i%37 + j%53);
		}
	}
	

	for ( i = 0 ; i < N ; i++ )
	{
		tmp = 0.0;
		for ( j = 0 ; j < N ; j++ )
		{
			tmp = tmp + gsl_matrix_get(A, i, j) * gsl_vector_get(v, j);
		}
		gsl_vector_set(r, i, tmp);
	}

	/* Imprimir o resultado */
	for ( i = 0 ; i < N ; i++ )
	{
		printf("%12.6lf\n", gsl_vector_get(r, i));
	}

}